package Logica;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java_cup.runtime.Symbol;
import java_cup.sym;

%%
LineTerminator = \r|\n|\r\n
espacioBlanco = {LineTerminator} | [ \t\f]

ide = [:letter:]([:letter:]|[:digit:]|"_"|"-")*
num = [0-9]+
cad= "{" [^"}"]* "}"

%cupsym simesc
%public
%class lexicoesc
%cup
%unicode
%char
%column
%line
%ignorecase

%{
protected java.util.HashMap<String, Integer> palabras_claves;

 public Integer getPalabraClave(String word) {
        if (word == null) {
            return null;
        }
        return palabras_claves.get(word.toLowerCase());
    }

public  void cargarPalabrasClaves(){
      palabras_claves = new java.util.HashMap<String,Integer>();


palabras_claves.put("nombre", simesc.nombre);
palabras_claves.put("tipo", simesc.tipo);
palabras_claves.put("pistanueva", simesc.pistanueva);
palabras_claves.put("lista", simesc.lista);
palabras_claves.put("pista", simesc.pista);
palabras_claves.put("pistas", simesc.pistas);
palabras_claves.put("listas", simesc.listas);
palabras_claves.put("aleatoria", simesc.aleatoria);
palabras_claves.put("solicitud",simesc.solicitud);
palabras_claves.put("si", simesc.si);
palabras_claves.put("no", simesc.no);
palabras_claves.put("duracion", simesc.duracion);
palabras_claves.put("numero", simesc.numero);
palabras_claves.put("canal", simesc.canal);
palabras_claves.put("nota", simesc.nota);
palabras_claves.put("frecuencia", simesc.frecuencia);
palabras_claves.put("datos", simesc.datos);
palabras_claves.put("octava", simesc.octava);
palabras_claves.put("do", simesc.do);
palabras_Claves.put("re", simesc.re);
palabras_Claves.put("mi", simesc.mi);
palabras_Claves.put("fa", simesc.fa);
palabras_Claves.put("sol", simesc.sol);
palabras_Claves.put("la", simesc.la);
palabras_claves.put("do#", simesc.do_);
palabras_Claves.put("re#", simesc.re_);
palabras_Claves.put("mi#", simesc.mi_);
palabras_Claves.put("fa#", simesc.fa_);
palabras_Claves.put("sol#", simesc.sol_);
palabras_Claves.put("la#", simesc.la_);
}

%}

%%

{ide} {  
 String lexema=yytext();
 Integer token=getPalabraClave(lexema);
 token=(token!=null)?token:new Integer(simesc.id);
 return new Symbol(token ,yycolumn,yyline+1,lexema);
}

{num} {
 String lexema=yytext();
 return new Symbol(simesc.num,yycolumn,yyline+1,new Integer(lexema));
         }

{cad} {
 String lexema=yytext();
 return new Symbol(simesc.cad,yycolumn,yyline+1,lexema.substring(1, lexema.length()-1));
         }

{espacioBlanco} { /* Se ignoran */}


"/" {
 String lexema=yytext();
 return new Symbol(simesc.slash,yycolumn,yyline+1,lexema);
}

"<" {
 String lexema=yytext();
 return new Symbol(simesc.menor,yycolumn,yyline+1,lexema);
 
}

">" {
 String lexema=yytext();
 return new Symbol(simesc.mayor,yycolumn,yyline+1,lexema);
}

"=" {
 String lexema=yytext();
 return new Symbol(simesc.igual,yycolumn,yyline+1,lexema);
}

.  { 
String lexema=yytext();
return new Symbol(simesc.error,yycolumn,yyline+1,lexema);
}


